 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package servlets;

import java.io.IOException;  
import java.util.Collection;  
import java.util.HashSet;
import javax.ejb.EJB;  
import javax.servlet.RequestDispatcher;  
import javax.servlet.ServletException;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import javax.servlet.http.HttpSession;
import gestionnaires.GestionnaireDisques;
import gestionnaires.GestionnaireUtilisateurs;
import gestionnaires.GestionnaireRealisateurs;
import gestionnaires.GestionnaireGenres;
import gestionnaires.GestionnaireActeurs;

import java.util.ArrayList;
import modeles.Disque;
import modeles.Utilisateur;

/**
 *
 * @author Julien Bellaiche
 * @author Romain Louveau
 */
@WebServlet(name = "ServletDisques", urlPatterns = {"/ServletDisques"})
public class ServletDisques extends HttpServlet {
    // ici injection de code ! On n'initialise pas !  
    @EJB
    private GestionnaireDisques gestionnaireDisques;
    @EJB
    private GestionnaireUtilisateurs gestionnaireUtilisateurs;
    @EJB
    private GestionnaireRealisateurs gestionnaireRealisateurs;
    @EJB
    private GestionnaireGenres gestionnaireGenres;
    @EJB
    private GestionnaireActeurs gestionnaireActeurs;

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        // Pratique pour décider de l'action à faire  
        String action = request.getParameter("action");  
        String forwardTo = "";  
        String message = "";  
        String titre = request.getParameter("titre");
        String recherche = request.getParameter("genre");
        String nom = request.getParameter("nom");
        String prenom = request.getParameter("prenom");  
        String connect = "";
        String idFilm = request.getParameter("idFilm");
        //Ajout film
        String add_titre = request.getParameter("add_titre");
        String add_realisateur = request.getParameter("add_realisateur");
        String add_genre = request.getParameter("add_genre");
        String add_pochette = request.getParameter("add_pochette");
        String add_acteur1 = request.getParameter("add_acteur1");
        request.setAttribute("listeRE", gestionnaireRealisateurs.getAllRealisateurs());
        request.setAttribute("listeG", gestionnaireGenres.getAllGenres());
        request.setAttribute("listeA", gestionnaireActeurs.getAllActeurs());
        //String add_prix = Integer.parseInt(request.getParameter("add_prix"));
        //double add_prix = Double.parseDouble(request.getParameter("add_prix"));
       
        HttpSession session = request.getSession(true);
        //String add_prix = request.getParameter("add_prix");
        

        if (action != null) {
            
            
            if (action.equals("listerLesDisques")) {
            String dep = request.getParameter("dep");
            String type = "next";
            int depIni = 0;
            int depPrev = 0;
            int depNext = 0;
            if(dep != null){
                depIni = Integer.parseInt(dep);
            }

            Collection<Disque> liste = null;
            depPrev = depIni - 9;
            depNext = depIni + 9;
            if (type != null){
                if(type.equals("next")){

                    System.out.print("aaa"+depNext);
                    liste = gestionnaireDisques.getNextDisques(depIni,9);
                    if (liste.size() < 9){
                        depNext = 0;
                    }
                } else {

                    System.out.print("kkk"+depPrev);
                    liste = gestionnaireDisques.getPrevDisques(depIni,9);
                    if (liste.size() < 9){
                        depPrev = 0;
                    }
                }
            } else {
                liste = gestionnaireDisques.getNextDisques(depIni,9);
                if (liste.size() < 9){
                    depNext = 0;
                    depPrev = 0;
                }
            }


            request.setAttribute("depNext", depNext);
            request.setAttribute("depPrev", depPrev);
            request.setAttribute("listeDesDisques", liste);
            forwardTo = "index.jsp?action=listerLesDisques";
            
            

            } else if (action.equals("creerDisquesDeTest")) {
                
                gestionnaireDisques.creerDisquesDeTest();   
                Collection<Disque> liste = gestionnaireDisques.getNextDisques(0,9);
                request.setAttribute("depNext", 9);
                request.setAttribute("depPrev", 0);
                request.setAttribute("listeDesDisques", liste);  
                forwardTo = "index.jsp?action=listerLesDisques";
                
                
                
             } else if (action.equals("chercherParLogin")) {
                if (titre.equals("") || titre.equals(" ")) {
                    message = "recherchevide";
                } else if (titre.equals("Recherchez")) {
                    message = "recherchelogin";
                } else if(recherche.equals("Titre")){
                    session.setAttribute("titre", recherche);
                    Disque utilisateurCherche = gestionnaireDisques.getDisqueFromTitre(titre);
                    request.setAttribute("utilisateurChercheParLogin", utilisateurCherche);
                    if(utilisateurCherche != null){
                        message = "rechercheok";
                    } else {
                        message = "rechercheno";
                        request.setAttribute("utilisateurNonTrouve", titre);
                    }
                    forwardTo = "index.jsp?action=chercherParLogin";
                } else if(recherche.equals("Realisateur")){
                    Collection<Disque> utilisateurCherche = gestionnaireDisques.getDisqueFromRealisateur(titre);
                    System.out.println(utilisateurCherche);
                    request.setAttribute("listeDesDisquesParReal", utilisateurCherche);
                    if(utilisateurCherche != null){
                        message = "rechercheok";
                    } else {
                        message = "rechercheno";
                        request.setAttribute("utilisateurNonTrouve", titre);
                    }
                    forwardTo = "index.jsp?action=rechercheParReal";
                }
                

                
            }else if (action.equals("listerLesDisquesAction")) {
                
            String dep = request.getParameter("dep");
            String type = "next";
            String genre = "action";
            int depIni = 0;
            int depPrev = 0;
            int depNext = 0;
            if(dep != null){
                depIni = Integer.parseInt(dep);
            }

            Collection<Disque> liste = null;
            depPrev = depIni - 9;
            depNext = depIni + 9;
            if(type != null){
                if(type.equals("next")){

                    System.out.print("aaa"+depNext);
                    liste = gestionnaireDisques.getNextDisquesGenre(depIni,9,genre);
                    if (liste.size() < 9){
                        depNext = 0;
                    }
                } else {

                    System.out.print("kkk"+depPrev);
                    liste = gestionnaireDisques.getPrevDisquesGenre(depIni,9,genre);
                    if (liste.size() < 9){
                        depPrev = 0;
                    }
                }
            } else {
                liste = gestionnaireDisques.getNextDisquesGenre(depIni,9,genre);
                if (liste.size() < 9){
                    depNext = 0;
                    depPrev = 0;
                }
            }


            request.setAttribute("depNext", depNext);
            request.setAttribute("depPrev", depPrev);
            request.setAttribute("listeDesDisquesGenre", liste);
            if(liste.size()==0){
                message = "rechercheko";
            }
            forwardTo = "index.jsp?action=listerLesDisquesGenre";
                
             
                
            }else if (action.equals("listerLesDisquesRomantique")) {
                
            String dep = request.getParameter("dep");
            String type = "next";
            String genre = "romantique";
            int depIni = 0;
            int depPrev = 0;
            int depNext = 0;
            if(dep != null){
                depIni = Integer.parseInt(dep);
            }

            Collection<Disque> liste = null;
            depPrev = depIni - 9;
            depNext = depIni + 9;
            if(type != null){
                if(type.equals("next")){

                    System.out.print("aaa"+depNext);
                    liste = gestionnaireDisques.getNextDisquesGenre(depIni,9,genre);
                    if (liste.size() < 9){
                        depNext = 0;
                    }
                } else {

                    System.out.print("kkk"+depPrev);
                    liste = gestionnaireDisques.getPrevDisquesGenre(depIni,9,genre);
                    if (liste.size() < 9){
                        depPrev = 0;
                    }
                }
            } else {
                liste = gestionnaireDisques.getNextDisquesGenre(depIni,9,genre);
                if (liste.size() < 9){
                    depNext = 0;
                    depPrev = 0;
                }
            }


            request.setAttribute("depNext", depNext);
            request.setAttribute("depPrev", depPrev);
            request.setAttribute("listeDesDisquesGenre", liste);
            if(liste.size()==0){
                message = "rechercheko";
            }
            forwardTo = "index.jsp?action=listerLesDisquesGenre";
                
             
                
            }else if (action.equals("listerLesDisquesSciencefiction")) {
            String dep = request.getParameter("dep");
            String type = "next";
            String genre = "science-fiction";
            int depIni = 0;
            int depPrev = 0;
            int depNext = 0;
            if(dep != null){
                depIni = Integer.parseInt(dep);
            }

            Collection<Disque> liste = null;
            depPrev = depIni - 9;
            depNext = depIni + 9;
            if(type != null){
                if(type.equals("next")){

                    System.out.print("aaa"+depNext);
                    liste = gestionnaireDisques.getNextDisquesGenre(depIni,9,genre);
                    if (liste.size() < 9){
                        depNext = 0;
                    }
                } else {

                    System.out.print("kkk"+depPrev);
                    liste = gestionnaireDisques.getPrevDisquesGenre(depIni,9,genre);
                    if (liste.size() < 9){
                        depPrev = 0;
                    }
                }
            } else {
                liste = gestionnaireDisques.getNextDisquesGenre(depIni,9,genre);
                if (liste.size() < 9){
                    depNext = 0;
                    depPrev = 0;
                }
            }


            request.setAttribute("depNext", depNext);
            request.setAttribute("depPrev", depPrev);
            request.setAttribute("listeDesDisquesGenre", liste);
            if(liste.size()==0){
                message = "rechercheko";
            }
            forwardTo = "index.jsp?action=listerLesDisquesGenre";
            
            } else if (action.equals("creerUnDisque")) {
                
                double add_prix = Double.parseDouble(request.getParameter("add_prix"));
                
                gestionnaireDisques.creeDisques(add_titre, null, add_genre, add_pochette,null, null,add_prix);
                message = "creerfok";
                forwardTo = "index.jsp?action=creerUnDisqueForm";
                

                
            }  else if (action.equals("creerUnDisqueForm")) {
                forwardTo = "index.jsp?action=creerUnDisqueForm";
                //session.setAttribute("kiki", "disque");
                //message = "enattente";
                
            }else if (action.equals("deleteDisque")) {
                
                String[] titres;
                titres = request.getParameterValues("titre");
                if (titres.length == 0) {
                    forwardTo = "index.jsp?action=deleteDisque";
                      message = "<h2>Selectionnez le (ou les) M1 a supprimer, pusi cliquez sur \"Supprimer\".:</h2>";
                      Collection<Disque> liste = gestionnaireDisques.getAllDisques();  
                      request.setAttribute("listeDesDisques", liste);  
                } else {
                    for (int i = 0; i < titres.length; i++){
                        gestionnaireDisques.deleteDisque(titres[i]);
                    }
                    forwardTo = "index.jsp?action=deleteDisquesForm";
                    message = "deleteok";
                    Collection<Disque> liste = gestionnaireDisques.getAllDisques();  
                    request.setAttribute("listeDesDisques", liste);  
                }
                
                
            }else if (action.equals("deleteDisquesForm")) {
                forwardTo = "index.jsp?action=deleteDisquesForm";        
                Collection<Disque> liste = gestionnaireDisques.getAllDisques();  
                request.setAttribute("listeDesDisques", liste);
                
                

            
            
            }else if (action.equals("updateDisquesForm")) {
                forwardTo = "index.jsp?action=updateDisquesForm";        
                Collection<Disque> liste = gestionnaireDisques.getAllDisques();  
                request.setAttribute("listeDesDisques", liste);  
            
            
            }else if (action.equals("updateThoseDisque")) {
                
                String[] titres;
                titres = request.getParameterValues("titre");
                System.out.println("kkkkkk");
                if (titres.length == 0) {
                    System.out.println("zzzzzz");
                    forwardTo = "index.jsp?action=updateDisquesForm";
                    message = "<h2>Selectionnez le (ou les) M1 a modifier, puis cliquez sur \"Modifier\".:</h2>";
                    Collection<Disque> liste = gestionnaireDisques.getAllDisques();  
                    request.setAttribute("listeDesDisques", liste);  
                } else {
                    System.out.println("aaaaa");
                    Collection <Disque> Disque = new HashSet<Disque>();
                    for (int i = 0; i < titres.length; i++){
                        Disque.add(gestionnaireDisques.getDisqueFromTitre(titres[i]));
                    }
                    forwardTo = "index.jsp?action=updateThoseDisque";
                    request.setAttribute("listeDesDisques", Disque);  
                } 
            
            
            }else if (action.equals("updateDisque")) {
                
                String tabUsers = request.getParameter("tabusers");
                String[] tabDUsers = tabUsers.split(";");
                    
                    for (int i = 1; i < tabDUsers.length; i++){
                        //String titredisqueInput = "t-"+tabDUsers[i];
                        String realisateurInput = "r-"+tabDUsers[i];
                        String genreInput = "g-"+tabDUsers[i];
                        String pochetteInput = "c-"+tabDUsers[i];
                        String prixInput = "p-"+tabDUsers[i];
                        //String titredisque = request.getParameter(titredisqueInput);
                        String realisateur = request.getParameter(realisateurInput);
                        String genre = request.getParameter(genreInput);
                        String pochette = request.getParameter(pochetteInput);
                        //String prix = request.getParameter(prixInput);
                        double prix = Double.parseDouble(request.getParameter(prixInput));
                        gestionnaireDisques.updateDisque(tabDUsers[i],realisateur ,genre ,pochette ,prix);
                    }
                      
                      Collection<Disque> liste = gestionnaireDisques.getAllDisques();  
                      request.setAttribute("listeDesDisques", liste);  
                      forwardTo = "index.jsp?action=updateDisquesForm";
                      message = "modifok";
            
                      
            }else if(action.equals("creerUnFilm")){
            

                 //récupère les champs du form
                 //String titre = request.getParameter("titre");
                 String resume = request.getParameter("resume");
                 String image =  request.getParameter("image");
                 double prix = Double.parseDouble(request.getParameter("prix"));
                 int quantite = Integer.parseInt(request.getParameter("quantite"));
                 boolean dispo = true; // par défaut il est disponible

                Collection<String> acteurs = new ArrayList();
                acteurs.add(request.getParameter("acteur1"));
                acteurs.add(request.getParameter("acteur2"));
                Collection<String> rubriques = new ArrayList();
                rubriques.add(request.getParameter("rubrique"));
                Collection<String> genres = new ArrayList();
                genres.add(request.getParameter("genre"));
          
            //   int r = Integer.parseInt(request.getParameter("realisateur"));
               // r= gestionnaireRealisateurs.getRealisateurByNom("Olivier");
               
               //Disque f= gestionnaireDisques.creeDisques(titre, prix, quantite, dispo, resume, image, genres,request.getParameter("realisateur"), acteurs, rubriques);

            }else {  
                forwardTo = "index.jsp?action=todo";  
                message = "La fonctionnalité pour le paramètre " + action + " est à implémenter !";  
            }
            
            
            
          }
               
  
        RequestDispatcher dp = request.getRequestDispatcher(forwardTo + "&message=" + message);  
        dp.forward(request, response);  
        // Après un forward, plus rien ne peut être exécuté après !  
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
